/**
 * @fileoverview Json解析模块
 * @author rainx 
 * @version $Id: json.js,v 1.11 2007/07/10 14:32:40 guoxiaod Exp $
 * @namespace YAHOO.CN.map.json
 * 
 * needed http://cn.yimg.com/i/js/1_1_0/ycnlib.js , YUI_FILES.connect support 
 *
 */ 

// 创建命名空间

YAHOO.namespace("CN.map.json");

/*
   Parameter([bool] isErr, [obj] data, [obj] err, [long] statusCode)

   @constructor 
   @param isErr : json是否包含错误
   @param data : json文件包含的信息内容,为解析后的json 对象
   @param err : json文件包含的错误内容,为解析后的json 对象
   @param statusCode : http header返回的状态代码 如 : 200 or 404
 */
YAHOO.CN.map.json.Parameter = function(isErr, data, err, statusCode)
{
    this._isErr = isErr;
    this._data = data || {};
    this._err = err || {};
    this._statusCode = statusCode;
};

YAHOO.CN.map.json.Parameter.prototype = {
    /**
     * json是否包含错误
     */ 
    isError : function()
    {
              return this._isErr
    },
    /**
     * json文件包含的信息内容,为解析后的json 对象
     */ 
    getData : function()
    {
              return this._data;
    },
    /**
     * json文件包含的错误内容,为解析后的json 对象
     */ 
    getErr : function()
    {
             return this._err;
    },
    /** 
     * http header返回的状态代码 如 : 200 or 404
     */
    getStatus : function()
    {
             return this._statusCode;
    }
};

/**
 * 对服务器返回的Json文档的解析 
 *
 * @constructor 
 */ 

YAHOO.CN.map.json.Parser = function()
{
};

YAHOO.CN.map.json.Parser.prototype = {
    /**
     * 解析指定的字符串 ,返回参数对象
     *
     * @param jsonStr : 从服务器端返回的Json字符串 or ''
     * @param statusCode : http header返回的状态代码 如 : 200 or 404
     */ 
    parse : function(jsonStr, statusCode, j)
    {
            if (typeof(jsonStr) == "string")
              {
                jsonStr = "json=" + jsonStr ;
                eval(jsonStr);
              }
            else
              {
                json = jsonStr;
              }
            return new j.Parameter(json.isErr, json.data, json.err, statusCode);
    }
};

/**
 * @constructor
 * @param args :  get或者 post的参数列表 形如 ['key1', 'value1', 'key2', 'value2', .....]
 */
YAHOO.CN.map.json.Arguments = function(args)
{
    this._keys = new Array();
    this._values = new Array();
    if (args != null)
      {
        for(var i = 0 ; i < args.length; i = i+2)
          {
            this._keys[this._keys.length] = args[i];
            this._values[this._values.length] = args[i+1];
          }
      }
};

YAHOO.CN.map.json.Arguments.prototype = {
    /**
     * 添加一个参数到列表
     * 
     * @param key  ， 传入参数的key
     * @param value : 传入参书的value, 可以为一个字符串或者数组
     */
    add : function(key, value)
        {
          var hasKey = false;
          for(var i = 0; i < this._keys.length; i++)
            {
              if (this._keys[i] == key)
                {
                  this._values[i] = value
                      hasKey = true;
                }
            }
          if(!hasKey)
            {
              this._keys[this._keys.length] = key;
              this._values[this._values.length] = value;
            }
        },
    /**
     * 返回query string
     * @return 返回get 或者 post 查询的字符串..  形如： paramA=xxxxxx＆paramB=yyyyy
     */
    getQueryString : function()
                   {
                     // TODO: process Array condition
                     queryString = '';
                     for(var i = 0; i < this._keys.length; i++)
                       {
                         if (this._values[i] instanceof Array)
                           {
                             for(var j = 0; j < this._values[i].length; j++)
                               {
                                 queryString += "&";
                                 queryString += this._keys[i] + "=";
                                 queryString += encodeURIComponent(this._values[i][j]);
                               }
                           }
                         else
                           {
                             queryString += "&";
                             queryString += this._keys[i] + "=" ;
                             queryString += encodeURIComponent(this._values[i]);
                           }
                       }
                     return queryString.substr(1, queryString.length -1);
                   }
};

/**
 * 构造Ajax请求并返回Parameter对象的处理函数 
 *  request是一个对象,它包含ajax请求的内容和回叫函数 <br>

    内容有 : <br>
<code>
request = 
{
    url :  要请求的url
    method :  请求的方式 "get" or "post"
    args : 一个Arguments 类型的对象， 包含所有get或者post的参数
    onData : 处理信息的回叫函数 ，回叫函数有一个参数为Parameter类型的对象
}
</code>
 * 
 * @param request 
 *
 */

YAHOO.CN.map.json.ajaxRequest = function(request)
{
    var url = request.url;
    var method = request.method;
    var args = request.args;
    var queryString = request.args.getQueryString();
    var j = YAHOO.CN.map.json;
    var y = YAHOO;
    var callback = {
        success : function(o)
        {
            var parser = new j.Parser();
            // 呼叫回叫函数.. 实现
            request.onData(parser.parse(o.responseText, o.status, j));
        },
        failure : function (o)
        {
            var parser = new j.Parser();
            var json = {
                       isErr: true,
                       err : {
                            errType : 2,
                            errCode : 1001,
                            errMsg: "Ajax Request Failure"
                       }
            }
            request.onData(parser.parse(json, o.status, j));
        }
    };
		

    if (method.toLowerCase() == "get")
    {
        // 处理get 请求
        if (queryString != "")
        {
            url = url + "?" + queryString;
        }
        YAHOO.util.Connect.asyncRequest(method, url, callback);
    }
    else
    {
        //处理post请求
        YAHOO.util.Connect.asyncRequest(method, url, callback, queryString)
    }

};
